/**
 * Created by sunchenglin on 2017/7/1.

数组实现链表
 （1） front为队头元素的下标，rear则指向下一个入队元素的下标
 （2）当front=rear时，我们约定队列为空。
 （3）出队操作改变front下标指向，即front=(front+1)%size;，入队操作改变rear下标指向，即rear=(rear+1)%size; size代表队列容量。
 （4）约定队列满的条件为front=(rear+1)%size,注意此时队列中仍有一个空的位置，此处留一个空位主要用于避免与队列空的条件front=rear相同。
 （5）队列内部的数组可扩容，并按照原来队列的次序复制元素数组
 */
public class Solution {


    public static void main(String args[]){

        Solution s = new Solution();
        CycleQueue queue = new CycleQueue(5);
        queue.add(1);
        queue.add(2);
        queue.add(3);
        queue.add(4);
        queue.remove();
        queue.remove();
        queue.add(3);
        queue.add(4);
        System.out.print(queue.size());


    }
}
class CycleQueue{
    private int font;
    private int rear;
    private int[] array;
    private int maxsize;

    CycleQueue(int size){
        this.maxsize = size;
        this.array = new int[maxsize];
        this.font = 0;
        this.rear = 0;

    }
    boolean isEmpty(){
        if (font == rear)
            return true;
        else
            return false;
    }
    int peek(){
        return array[font];
    }
    void add(int i){
        if ((rear+1)%maxsize==font)
            System.out.println("full error");
        else{
            array[rear] = i;
            rear = (rear+1)%maxsize;
        }


    }
    int  remove(){
        int data = 0;
        if (isEmpty())
            System.out.println("empty error");
        else{
            data = array[font];
            font = (font+1)%maxsize;
        }
        return data;

    }

    int size(){
        return (rear-font+maxsize)%maxsize;
    }

}
